如何创建"上下文"式右键菜单
菜单常见的形式有两种,一种是在标题栏处的标准菜单样式,另外一种称之为"上下文"菜单,常常在右击时,在鼠标所在的位置弹出一个菜单,可以使用CMenu::TrackPopupMenu函数来实现这一功能,步骤如下:
(1)创建一个基于对话框的、使用MFC库的Windows应用程序工程。
(2)使用向导实现主对话框类对消息WM_CONTEXTMENU的响应,向导添加类似下面的代码:
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
// TODO: Add your control notification handler code here
}
(3)在资源视图中插入一个MENU菜单,资源ID为IDR_MENU1。其中菜单项A、B、C的ID代码分别为ID_ MENUITEM_A、ID_MENUITEM_B、ID_MENUITEM_C。
(4)实现OnContextMenu函数的代码如下:
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point){
// TODO: Add your message handler code here
// TODO: Add your control notification handler code here
CMenu menu;
// 装入菜单
menu.LoadMenu(IDR_MENU1);
// 显示菜单(第一个子菜单项)
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x, point.y, this);
}
(5)实现菜单项A、B、C的事件响应,在CXXDlg类头文件和cpp文件中添加如下代码:
//.h文件
afx_msg void OnMenuitemA();
afx_msg void OnMenuitemB();
afx_msg void OnMenuitemB();
//cpp文件
BEGIN_MESSAGE_MAP(CMFCDlg, CDialog)
//{{AFX_MSG_MAP(CMFCDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_MENUITEM_A, OnMenuitemA)
ON_COMMAND(ID_MENUITEM_B, OnMenuitemB)
ON_COMMAND(ID_MENUITEM_C, OnMenuitemC)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()void CXXDlg::OnMenuitemA()
{
// TODO: Add your command handler code here
AfxMessageBox("A");
}
void CXXDlg::OnMenuitemB()
{
// TODO: Add your command handler code here
AfxMessageBox("B");
}
void CXXDlg::OnMenuitemC()
{
// TODO: Add your command handler code here
AfxMessageBox("C");
}
(6)按Ctrl+F5键编译并运行程序。
注意:除了本节中介绍的使用WM_CONTEXTMENU消息响应函数来显示动态创建的菜单之外,还有另外一种方法可以使用,而且更加的灵活,即响应鼠标右击消息,然后处理右击消息的函数体内调用相关函数获得鼠标的位置,再创建CMenu对象,调用成员函数TrackPopupMenu来显示创建的上下文菜单。